#include "linkqueue2.h"
int main(int argc, char const *argv[])
{
   LinkQueue *q=init_LinkQueue();//初始化队列
   //入队
   push_LinkQueue(q,1);
   push_LinkQueue(q,2);
   push_LinkQueue(q,3);
   push_LinkQueue(q,4);
   push_LinkQueue(q,5);
   //遍历
   output_LinkQueue(q);
   //出队测试
   printf("出队测试：\n");
   data_Type v;
   while(!pop_LinkQueue(q,&v))
   {
    printf("%d\t",v);
   }
   printf("\n");
   //再次入队测试
   push_LinkQueue(q,1);
   push_LinkQueue(q,2);
   push_LinkQueue(q,3);
   push_LinkQueue(q,4);
   push_LinkQueue(q,100);
   push_LinkQueue(q,50);
   push_LinkQueue(q,7);
   push_LinkQueue(q,8);
   output_LinkQueue(q);//遍历
   //队列的长度
   printf("队列长度：%d\n",size_LinkQueue(q));
   //删除元素测试
   delet_LinkQueue(q,100);
   output_LinkQueue(q);//遍历
   printf("删除1\n");
   delet_LinkQueue(q,1);
   output_LinkQueue(q);//遍历
   printf("删除8\n");
   delet_LinkQueue(q,8);
   output_LinkQueue(q);//遍历
   printf("删除999\n");
   delet_LinkQueue(q,999);
   output_LinkQueue(q);//遍历
   //修改测试
   modify_LinkQueue(q,50,555);
   output_LinkQueue(q);//遍历
   printf("改尾\n");
   modify_LinkQueue(q,7,444);
   output_LinkQueue(q);//遍历
   printf("改头\n");
   modify_LinkQueue(q,2,666);
   output_LinkQueue(q);//遍历
   printf("改不存在的数据\n");
   modify_LinkQueue(q,2,777);
   output_LinkQueue(q);//遍历
//插入
     printf("队首插入：\n");
     insert_LinkQueue(q,666,250);
     output_LinkQueue(q);//遍历
    printf("队尾插入：\n");
    insert_LinkQueue(q,444,251);
    output_LinkQueue(q);//遍历
    printf("队中插入：\n");
    insert_LinkQueue(q,4,252);
    output_LinkQueue(q);//遍历
    printf("队中插入2：\n");
    insert_LinkQueue(q,789,253);
    output_LinkQueue(q);//遍历
    printf("销毁测试：\n");
    destory_LinkQueue(q);//执行完以后q已经是一个野指针
    q=NULL;//此时让q变成一个空指针
    output_LinkQueue(q);//遍历
    return 0;
}

//初始化
LinkQueue *init_LinkQueue()
{
    LinkQueue *Q=(LinkQueue*)malloc(sizeof(LinkQueue));//分配16个字节  只有两个指针 链式队列结构体类型的指针
    //所以在这里还只是为两个指针变量front rear 分配了空间
    if(Q==NULL)
    {
        printf("malloc failed\n");
        return NULL;
    }
    //为队列创建一个头结点  不存放数据
    pNode head=(pNode)malloc(sizeof(Node));
    if (head==NULL)
    {
        printf("malloc failed\n");
        return NULL;
    }
    
    head->next=NULL;
    //空队列  front 和rear指针都应该指向head
    Q->front=Q->rear=head;
    return Q;
    
}
//入队
int push_LinkQueue(LinkQueue *queue, data_Type value)
{
    if(queue==NULL)
    {
        printf("ERROR\n");
        return -1;

    }
    //创建一个新的结点
    pNode newnode=(pNode)malloc(sizeof(Node));
    if (newnode==NULL)
    {
        printf("malloc failed\n");
        return -1;
    }
    //赋值
    memcpy(&newnode->data,&value,sizeof(data_Type));
    newnode->next=NULL;
    //操作指针
    queue->rear->next=newnode;//向对尾插入数据
    queue->rear=queue->rear->next; //移动队尾指针的指向
    return 0;
}
//出队
int  pop_LinkQueue(LinkQueue *queue,data_Type *value)
{
    //判断
    if(empty_LinkQueue(queue))
    {
        return -1;
    }
    //保存值
    *value=queue->front->next->data;//queue->front指向的是头结点 而头结点无数据
    //保存要释放的结点
    pNode temp=queue->front->next;
  //  printf("pop:%d %p\n",temp->data,temp->next);
    //指针操作
    queue->front->next=temp->next;//指向下一个结点
    if(temp==queue->rear)//尾节点  变成空队
    {
        queue->rear=queue->front;
    }
    //释放
    free(temp);
    return 0;
}
//判空
int empty_LinkQueue(LinkQueue *queue)
{
    if(queue==NULL)
    {
        printf("queue is null\n");
        return -1;
    }
    if (queue->front==NULL)
    {
        printf("queue->front==NULL\n");
       return -1;
    }
    if (queue->rear==NULL)
    {
        printf("queue->rear==NULL\n");
       return -1;
    }
    
    if(queue->front==queue->rear)
    {
        printf("queue is empty\n");
        return -1;
    }
    return 0;
}
//取队头元素
data_Type front_LinkQueue(LinkQueue *queue)
{
    if(empty_LinkQueue(queue))
    {
        return -1;
    }
    return queue->front->next->data;
}
//取队尾元素
data_Type back_LinkQueue(LinkQueue *queue)
{
    if(empty_LinkQueue(queue))
    {
        return -1;
    }
    return queue->rear->data;
}
//清空
void clear_LinkQueue(LinkQueue *queue)
{

}
//输出
void output_LinkQueue(LinkQueue *queue)
{
    if(empty_LinkQueue(queue))
    {
        return;
    }
    printf("队的遍历:\n");
    //输出
    pNode t=queue->front->next;//队的第一个结点
    while(t!=NULL)
    {
        printf("%d\t",t->data);
        t=t->next;
    }

    printf("\n");

}
//大小
int size_LinkQueue(LinkQueue *queue)
{
    if(empty_LinkQueue(queue))
    {
        return 0;
    }
    int cnt=0;
    pNode t=queue->front->next;//
    while(t!=NULL)
    {
        t=t->next;
        cnt++;
    }
    return cnt;
}
//销毁
void destory_LinkQueue(LinkQueue *queue)
{
    if(empty_LinkQueue(queue))
    {
        return ;
    }
    //从对头开始销毁
    pNode t=queue->front->next;//
    while (t!=NULL)//
    {
        //释放t  先保存t的next
       pNode q=t->next;
       //释放t
       //memset清空数据
       printf("释放数据：%d\n",t->data);
       free(t);
       t=q;
    }
    free(queue);

}
 //删除某个元素 (value所在的结点)
 int delet_LinkQueue(LinkQueue *queue,data_Type value)
 {
    if(empty_LinkQueue(queue))
    {
        return -1;
    }
    pNode t=queue->front;//
    while (t->next!=NULL&&(value!=t->next->data))//如果找到了 或者到末尾了就结束循环
    {
        printf("find :%d\n",t->data);
       t=t->next;
    }
    //如果t->==NULL 表示到结尾都没有找到这个元素 不需要做任何删除 的操作
    if(t->next==NULL)
    {
        printf("not find \n");
        return -1;
    }
    //指针操作
    printf("find up data:%d\n",t->data);//这个数值 是当前查找的这个元素的上一个结点的数据
    //要删除的是下一个结点t->next
    pNode q=t->next;
    t->next=q->next;
    free(q);
    return 0;
    

 }
 //修改
 int modify_LinkQueue(LinkQueue *queue,data_Type value,data_Type new_value)
 {
    if(empty_LinkQueue(queue))
    {
        return -1;
    }
    pNode t=queue->front->next;//
    while (t!=NULL&&(value!=t->data))//如果找到了 或者到末尾了就结束循环
    {
       // printf("find :%d\n",t->data);
       t=t->next;
    }
    //如果t->==NULL 表示到结尾都没有找到这个元素 不需要做任何删除 的操作
    if(t==NULL)
    {
        printf("not find \n");
        return -1;
    }
    memcpy(&t->data,&new_value,sizeof(data_Type));
    return 0;
 }
 //插入 将new_value在队列当中插入到value的前面  找value的前一个结点
 int insert_LinkQueue(LinkQueue *queue,data_Type value,data_Type new_value)
 {
        if(empty_LinkQueue(queue))
        {
            return -1;
        }
        pNode t=queue->front;//
        while (t->next!=NULL&&(value!=t->next->data))//如果找到了 或者到末尾了就结束循环
        {
           
           t=t->next;
        }
        //如果t->==NULL 表示到结尾都没有找到这个元素 不需要做任何删除 的操作
        if(t->next==NULL)
        {
            printf("not find \n");
            return -1;
        }
 
     //   printf("find up data:%d\n",t->data);//这个数值 是当前查找的这个元素的上一个结点的数据
     pNode newnode=(pNode)malloc(sizeof(Node));
     if (newnode==NULL)
     {
         printf("malloc failed\n");
         return -1;
     }
     //赋值
     memcpy(&newnode->data,&new_value,sizeof(data_Type));
     newnode->next=NULL;

     //指针操作  
     newnode->next=t->next;//新节点的后继指向原来这个位置的结点
     t->next=newnode;//上一个结点的后继指向新节点
     return 0;
 }